home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / sbin / generate-modprobe.conf < prev    next >
Text File  |  2006-01-09  |  9KB  |  282 lines

  1. #!/bin/bash
  2. #
  3. # Naive shell script to translate modules.conf + defaults to modprobe.conf
  4. # Normal caveats apply, as with any machine translation.
  5. #
  6. # Updated 07 May 2004 by Aron Griffis <agriffis@gentoo.org> to support
  7. # --assume-kernel option for Gentoo LiveCD building.  See
  8. # http://bugs.gentoo.org/show_bug.cgi?id=49927
  9.  
  10. # Parse command-line
  11. STDIN=
  12. KV=`uname -r`
  13. while [[ "$1" == --* ]]; do
  14.     case "$1" in
  15.     --assume-kernel=*)
  16.         KV=${1#*=}
  17.         ;;
  18.     --stdin)
  19.         STDIN=1
  20.         ;;
  21.     *)
  22.         echo "Usage: $0 [--stdin] [--assume-kernel=n.n.n] [modprobe.conf]"
  23.         echo "   Converts your current modules setup to modprobe.conf."
  24.         echo "   Don't trust it too much."
  25.         echo " Version 0.1"
  26.         exit 1
  27.         ;;
  28.     esac
  29.     shift
  30. done
  31.  
  32. # Set up output if specified.
  33. if [ $# -eq 1 ]; then exec > $1; fi
  34.  
  35. MODPROBECONF=`mktemp /tmp/modprobe.XXXXXX || tempfile || echo /tmp/modprobe.$$`
  36. trap "rm -f $MODPROBECONF" 0
  37.  
  38. modprobe_abort()
  39. {
  40.     echo Failed to to run modprobe.  Giving up. 2>&1
  41.     exit 1
  42. }
  43.  
  44. if [ x"$TESTING_MODPROBE_CONF" != x ]; then
  45.     cp $TESTING_MODPROBE_CONF $MODPROBECONF
  46. elif [ "$STDIN" = "1" ]; then
  47.     cat > $MODPROBECONF
  48. elif [ -x /sbin/modprobe.old ]; then
  49.     # In sbin.
  50.     /sbin/modprobe.old -c > $MODPROBECONF || modprobe_abort
  51. elif modprobe.old -c >/dev/null 2>&1; then
  52.     # Somewhere in path.
  53.     modprobe.old -c > $MODPROBECONF || modprobe_abort
  54. elif /sbin/modprobe -V 2>/dev/null | grep -q 'modprobe version'; then
  55.     # Running /sbin/modprobe gives old version.
  56.     /sbin/modprobe -c > $MODPROBECONF || modprobe_abort
  57. elif modprobe -V 2>/dev/null | grep -q 'modprobe version'; then
  58.     # Running modprobe gives old version.
  59.     modprobe -c > $MODPROBECONF || modprobe_abort
  60. else
  61.     echo Cannot find old version of modprobe.  Giving up. 2>&1
  62.     exit 1
  63. fi
  64.  
  65. # Resolve (possibly recursive) alias: args filename alias
  66. resolve_alias()
  67. {
  68.     RA_RESOLVE=`grep "^alias[     ][     ]*$2[     ]" -- $1 | awk '{ print $3 }'`
  69.     if [ x"$RA_RESOLVE" = x ]; then
  70.     echo $2
  71.     return
  72.     fi
  73.     # Recurse.
  74.     (resolve_alias $1 "$RA_RESOLVE")
  75. }
  76.  
  77. # Parse alias: args filename modulename aliasto.
  78. parse_alias()
  79. {
  80.     PA_ALIAS=`resolve_alias $1 $3`
  81.     NAME=`echo $2|sed -e 's/\(block\|char\)-major-\([0-9]\+\)$/\1-major-\2-*/'`
  82.  
  83.     echo "alias $NAME $PA_ALIAS"
  84. }
  85.  
  86. # Parse options: args modulename aliasto.
  87. parse_options()
  88. {
  89.     # Second arg can be null if grab_noninstall options returns empty.
  90.     [ x"$2" = x ] || echo "options $1 $2"
  91. }
  92.  
  93. # Separate out the modprobe options from the module options
  94. grab_install_options()
  95. {
  96.     GRAB_OPTS=""
  97.     GRAB_NEXT=0
  98.     for grab_i; do
  99.     case "$grab_i" in
  100.     -o) GRAB_OPTS="$GRAB_OPTS -o"; GRAB_NEXT=1;;
  101.     -*) echo Warning: Ignoring unknown alias option "$grab_i" >&2;;
  102.     *)
  103.         [ $GRAB_NEXT = 0 ] || GRAB_OPTS="$GRAB_OPTS $grab_i"
  104.         GRAB_NEXT=0
  105.         ;;
  106.     esac
  107.     done
  108.     echo "$GRAB_OPTS"
  109. }
  110.  
  111. grab_noninstall_options()
  112. {
  113.     GRAB_OPTS=""
  114.     GRAB_NEXT=0
  115.     for grab_i; do
  116.     case "$grab_i" in
  117.     -o) GRAB_NEXT=1;;
  118.     -*) ;;
  119.     *)
  120.         [ $GRAB_NEXT = 1 ] || GRAB_OPTS="$GRAB_OPTS $grab_i"
  121.         GRAB_NEXT=0
  122.         ;;
  123.     esac
  124.     done
  125.     echo "$GRAB_OPTS"
  126. }
  127.  
  128. # Produce a multiple install/remove commands. Args: list, command, separator.
  129. multi()
  130. {
  131.     mp_res=""
  132.     for mp_arg in $1; do
  133.     if [ x"$mp_res" = x ]; then mp_res="/sbin/$2 $mp_arg";
  134.     else mp_res="$mp_res${3}/sbin/$2 $mp_arg";
  135.     fi
  136.     done
  137.     echo "$mp_res"
  138. }
  139.  
  140. # Install and remove commands frequently refer to insmod and rmmod.
  141. # Use "modprobe --ignore-install " and "modprobe -r --ignore-remove" since 
  142. # our versions of rmmod and insmod are deliberately stupid.
  143. convert_command()
  144. {
  145.     echo "$@" | sed -e 's,insmod,/sbin/modprobe --ignore-install,' -e 's,rmmod,/sbin/modprobe -r --ignore-remove,'
  146. }
  147.  
  148. while read ADD NAME MODULE REST; do
  149.     # Ignore a spurious add, otherwise move them down.
  150.     if [ x"$ADD" = x"add" ]; then :; else
  151.     REST="`echo $MODULE $REST | sed 's/ *$//'`"
  152.     MODULE="$NAME"
  153.     NAME="$ADD";
  154.     fi
  155.     #echo "NAME=$NAME MODULE=$MODULE REST=$REST" >&2
  156.  
  157.     # MODNAME is the converted name for use in variables.
  158.     MODNAME=`echo $MODULE | tr -c A-Za-z_0-9 _`
  159.     case "$NAME" in
  160.     '#'*) : ;; # Comment 
  161.     '') : ;;   # Blank line
  162.  
  163.     keep) # Do nothing.
  164.     ;;
  165.  
  166.     alias)
  167.     if [ x"$REST" = xoff ] || [ x"$REST" = xnull ]; then
  168.         INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE"
  169.         eval install_$MODNAME=\"/bin/true\"
  170.     else
  171.         parse_alias $MODPROBECONF "$MODULE" $REST
  172.     fi
  173.     ;;
  174.  
  175.     options) 
  176.     # Options used to be able to contain extra args to insmod
  177.     # (eg. -o foo).  Not any more.
  178.     case " $REST" in
  179.     *' '-[-a-z]*)
  180.         parse_options $MODULE `grab_noninstall_options $REST`
  181.         INSTALL_OPTIONS=`grab_install_options $REST`
  182.         INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE"
  183.         eval install_$MODNAME=\"/sbin/modprobe $INSTALL_OPTIONS --ignore-install `resolve_alias $MODPROBECONF $MODULE`\"
  184.         ;;
  185.     *)
  186.         parse_options $MODULE "$REST"
  187.         ;;
  188.     esac
  189.     ;;
  190.  
  191.     above)
  192.     # Pull in these modules after me.
  193.     INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE"
  194.     eval post_install_$MODNAME=\"`multi "$REST" 'modprobe' '; '`\; /bin/true\"
  195.     REMOVE_COMMANDS="$REMOVE_COMMANDS $MODULE"
  196.     eval pre_remove_$MODNAME=\"`multi "$REST" 'modprobe -r' '; '`\"
  197.     ;;
  198.     below)
  199.     # Pull in these modules before me.
  200.     INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE"
  201.     eval pre_install_$MODNAME=\"`multi "$REST" 'modprobe' '; '`\"
  202.     REMOVE_COMMANDS="$REMOVE_COMMANDS $MODULE"
  203.     eval post_remove_$MODNAME=\"`multi "$REST" 'modprobe -r' '; '`\; /bin/true\"
  204.     ;;
  205.     probe) 
  206.     INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE"
  207.     eval install_$MODNAME=\"`multi "$REST" 'modprobe' ' || '`\"
  208.     ;;
  209.     probeall)
  210.     # Not quite correct.  If they all fail, we should fail.
  211.     INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE"
  212.     eval install_$MODNAME=\"`multi "$REST" 'modprobe' '; '`\; /bin/true\"
  213.     ;;
  214.     post-install)
  215.     INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE"
  216.     eval post_install_$MODNAME=\"`convert_command "$REST"`\"
  217.     ;;
  218.     pre-install)
  219.     INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE"
  220.     eval pre_install_$MODNAME=\"`convert_command "$REST"`\"
  221.     ;;
  222.     install)
  223.     INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE"
  224.     eval install_$MODNAME=\"`convert_command "$REST"`\"
  225.     ;;
  226.     post-remove)
  227.     REMOVE_COMMANDS="$REMOVE_COMMANDS $MODULE"
  228.     eval post_remove_$MODNAME=\"`convert_command "$REST"`\"
  229.     ;;
  230.     pre-remove)
  231.     REMOVE_COMMANDS="$REMOVE_COMMANDS $MODULE"
  232.     eval pre_remove_$MODNAME=\"`convert_command "$REST"`\"
  233.     ;;
  234.     remove)
  235.     REMOVE_COMMANDS="$REMOVE_COMMANDS $MODULE"
  236.     eval remove_$MODNAME=\"`convert_command "$REST"`\"
  237.     ;;
  238.     include)
  239.     # Recurse.
  240.     ($0 $MODULE)
  241.     ;;
  242.     # Ignore default lines which are not required any more.
  243.     "path[boot]=/lib/modules/boot"|"path[toplevel]=/lib/modules/$KV"|"path[toplevel]=/lib/modules/2.4"|"path[kernel]=/lib/modules/kernel"|"path[fs]=/lib/modules/fs"|"path[net]=/lib/modules/net"|"path[scsi]=/lib/modules/scsi"|"path[block]=/lib/modules/block"|"path[cdrom]=/lib/modules/cdrom"|"path[ipv4]=/lib/modules/ipv4"|"path[ipv6]=/lib/modules/ipv6"|"path[sound]=/lib/modules/sound"|"path[fc4]=/lib/modules/fc4"|"path[video]=/lib/modules/video"|"path[misc]=/lib/modules/misc"|"path[pcmcia]=/lib/modules/pcmcia"|"path[atm]=/lib/modules/atm"|"path[usb]=/lib/modules/usb"|"path[ide]=/lib/modules/ide"|"path[ieee1394]=/lib/modules/ieee1394"|"path[mtd]=/lib/modules/mtd"|"generic_stringfile=/lib/modules/$KV/modules.generic_string"|"pcimapfile=/lib/modules/$KV/modules.pcimap"|"isapnpmapfile=/lib/modules/$KV/modules.isapnpmap"|"usbmapfile=/lib/modules/$KV/modules.usbmap"|"parportmapfile=/lib/modules/$KV/modules.parportmap"|"ieee1394mapfile=/lib/modules/$KV/modules.ieee1394map"|"pnpbiosmapfile=/lib/modules/$KV/modules.pnpbiosmap"|"depfile=/lib/modules/$KV/modules.dep"|"persistdir=/var/lib/modules/persist")
  244.     ;;
  245.  
  246.     # Ignore prune lines unless they end in .o or .ko, which would
  247.     # have an effect.
  248.     prune)
  249.     case "$MODULE" in
  250.     *.ko|*.o)
  251.         echo "Warning: not translating $NAME $MODULE $REST" >&2
  252.         ;;
  253.     esac
  254.     ;;
  255.     *)
  256.     echo "Warning: not translating $NAME $MODULE $REST" >&2
  257.     ;;
  258.     esac
  259. done < $MODPROBECONF
  260.  
  261. for mod in `echo $INSTALL_COMMANDS | tr ' ' '\n' | sort -u`; do
  262.     # MODNAME is the converted name for use in variables.
  263.     MODNAME=`echo $mod | tr -c A-Za-z_0-9 _`
  264.     eval PREINSTALL=\"\$pre_install_$MODNAME\"
  265.     eval POSTINSTALL=\"\$post_install_$MODNAME\"
  266.     eval INSTALL=\"\$\{install_$MODNAME:-/sbin/modprobe --first-time --ignore-install $mod}\"
  267.     if [ -n "$PREINSTALL" ]; then PREINSTALL="{ $PREINSTALL; } ; "; fi
  268.     if [ -n "$POSTINSTALL" ]; then POSTINSTALL="&& { $POSTINSTALL; }"; fi
  269.     echo install $mod $PREINSTALL $INSTALL $POSTINSTALL
  270. done
  271.  
  272. for mod in `echo $REMOVE_COMMANDS | tr ' ' '\n' | sort -u`; do
  273.     # MODNAME is the converted name for use in variables.
  274.     MODNAME=`echo $mod | tr -c A-Za-z_0-9 _`
  275.     eval PREREMOVE=\"\$pre_remove_$MODNAME\"
  276.     eval POSTREMOVE=\"\$post_remove_$MODNAME\"
  277.     eval REMOVE=\"\$\{remove_$MODNAME:-/sbin/modprobe -r --first-time --ignore-remove $mod}\"
  278.     if [ -n "$PREREMOVE" ]; then PREREMOVE="{ $PREREMOVE; } ; "; fi
  279.     if [ -n "$POSTREMOVE" ]; then POSTREMOVE="&& { $POSTREMOVE; }"; fi
  280.     echo remove $mod $PREREMOVE $REMOVE $POSTREMOVE
  281. done
  282.